package mx.ipn.persistencia.mysql;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

import mx.ipn.persistencia.FabricaDeDAOs;
import mx.ipn.persistencia.dao.ClienteRfcDAO;
import mx.ipn.persistencia.dao.BitacoraServicioDAO;
import mx.ipn.persistencia.dao.DetallePrefacturaDAO;
import mx.ipn.to.BitacoraServicioTO;
import mx.ipn.to.ClienteRfcTO;
import mx.ipn.to.DetallePrefacturaTO;

public class DetallePrefacturaDAOMySQL implements DetallePrefacturaDAO {
	static{FabricaDeDAOsMySQL.iniciaLog(DetallePrefacturaDAOMySQL.class);}

	private static final String INSERT = "INSERT INTO detalle_prefactura (id_cliente_rfc,id_operacion,considerado) VALUES(?,?,?)";
	private static final String UPDATE = "UPDATE detalle_prefactura SET id_cliente_rfc=?,id_operacion=?,considerado=? WHERE id_detalle_prefactura=?";
	private static final String FINDBYID = "SELECT * FROM detalle_prefactura WHERE id_detalle_prefactura =?";
	private static final String SELECT = "SELECT * FROM detalle_prefactura";
	private static final String SELECTBYCLIENTERFC = "SELECT * FROM detalle_prefactura WHERE id_cliente_rfc=?";
	private static final String SELECTBYCLIENTERFCCONSIDERADO = "SELECT * FROM detalle_prefactura WHERE id_cliente_rfc=? AND considerado=?";
	private static final String SELECTBYREGISTRO = "SELECT DP.id_detalle_prefactura,DP.id_cliente_rfc,DP.id_operacion,DP.considerado,R.registro FROM "
			+ "detalle_prefactura DP,cliente_rfc CR,rfc R WHERE R.id_rfc = CR.id_rfc AND CR.id_cliente_rfc=DP.id_cliente_rfc AND "
			+ "R.registro =?";
	private static final String SELECTBYREGISTROCONSIDERADO = "SELECT DP.id_detalle_prefactura,DP.id_cliente_rfc,DP.id_operacion,DP.considerado,R.registro FROM "
			+ "detalle_prefactura DP,cliente_rfc CR,rfc R WHERE R.id_rfc = CR.id_rfc AND CR.id_cliente_rfc=DP.id_cliente_rfc AND "
			+ "R.registro =? AND considerado=?";
	private static final String SELECTBYBITACORASERVICIO = "SELECT * FROM detalle_prefactura WHERE id_operacion=?";
	private static final String SELECTBYBITACORASERVICIOCONSIDERADO = "SELECT * FROM detalle_prefactura WHERE id_operacion=? AND considerado=?";

	@Override
	public DetallePrefacturaTO findByDetallePrefactura(int idDetallePrefactura) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(FINDBYID);

			ps.setInt(1, idDetallePrefactura);

			ResultSet rs = ps.executeQuery();

			if (rs.next()) {

				FabricaDeDAOs fabricaMySQL = FabricaDeDAOs
						.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

				ClienteRfcDAO clienteRfcDAO = fabricaMySQL.getClienteRfcDAO();
				BitacoraServicioDAO bitacoraServicioDAO = fabricaMySQL
						.getBitacoraServicioDAO();

				ArrayList<ClienteRfcTO> listClienteRfcTO = new ArrayList<ClienteRfcTO>();
				ArrayList<BitacoraServicioTO> listBitacoraServicioTO = new ArrayList<BitacoraServicioTO>();

				listClienteRfcTO.add(clienteRfcDAO.findClienteRfcById(rs
						.getInt("id_cliente_rfc")));
				listBitacoraServicioTO.add(bitacoraServicioDAO
						.findBitacoraServicioById(rs.getInt("id_operacion")));
				boolean considerado = rs.getBoolean("considerado");

				ClienteRfcTO[] arrClienteRfcTO = (ClienteRfcTO[]) listClienteRfcTO
						.toArray(new ClienteRfcTO[listClienteRfcTO.size()]);
				BitacoraServicioTO[] arrBitacoraServicioTO = (BitacoraServicioTO[]) listBitacoraServicioTO
						.toArray(new BitacoraServicioTO[listBitacoraServicioTO
								.size()]);

				DetallePrefacturaTO detallePrefacturaTO = new DetallePrefacturaTO(
						idDetallePrefactura, arrClienteRfcTO,
						arrBitacoraServicioTO, considerado);

				ps.close();
				conexion.close();
				return detallePrefacturaTO;
			}

			ps.close();
			conexion.close();
			return null;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public boolean insertDetallePrefactura(
			DetallePrefacturaTO detallePrefacturaTO) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(INSERT);

			ps.setInt(1, detallePrefacturaTO.getIdClienteRfc());
			ps.setInt(2, detallePrefacturaTO.getIdOperacion());
			ps.setBoolean(3, detallePrefacturaTO.getConsiderado());

			ps.executeUpdate();

			ps.close();
			conexion.close();

			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}

	@Override
	public ArrayList<DetallePrefacturaTO> selectDetallePrefactura() {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			FabricaDeDAOs fabricaMySQL = null;

			ClienteRfcDAO clienteRfcDAO = null;
			BitacoraServicioDAO bitacoraServicioDAO = null;

			ArrayList<DetallePrefacturaTO> detallePrefacturaTO = null;
			DetallePrefacturaTO detallePrefacturaTO2 = null;

			PreparedStatement ps = conexion.prepareStatement(SELECT);

			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (detallePrefacturaTO == null) {
					detallePrefacturaTO = new ArrayList<DetallePrefacturaTO>();
					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);
					clienteRfcDAO = fabricaMySQL.getClienteRfcDAO();
					bitacoraServicioDAO = fabricaMySQL.getBitacoraServicioDAO();
				}

				int idDetallePrefactura = rs.getInt("id_detalle_prefactura");
				ArrayList<ClienteRfcTO> listClienteRfcTO = new ArrayList<ClienteRfcTO>();
				ArrayList<BitacoraServicioTO> listBitacoraServicioTO = new ArrayList<BitacoraServicioTO>();

				listClienteRfcTO.add(clienteRfcDAO.findClienteRfcById(rs
						.getInt("id_cliente_rfc")));
				listBitacoraServicioTO.add(bitacoraServicioDAO
						.findBitacoraServicioById(rs.getInt("id_operacion")));
				boolean considerado = rs.getBoolean("considerado");

				ClienteRfcTO[] arrClienteRfcTO = (ClienteRfcTO[]) listClienteRfcTO
						.toArray(new ClienteRfcTO[listClienteRfcTO.size()]);
				BitacoraServicioTO[] arrBitacoraServicioTO = (BitacoraServicioTO[]) listBitacoraServicioTO
						.toArray(new BitacoraServicioTO[listBitacoraServicioTO
								.size()]);

				detallePrefacturaTO2 = new DetallePrefacturaTO(
						idDetallePrefactura, arrClienteRfcTO,
						arrBitacoraServicioTO, considerado);

				detallePrefacturaTO.add(detallePrefacturaTO2);
			}
			ps.close();
			conexion.close();
			return detallePrefacturaTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public DetallePrefacturaTO selectdetalleprefacturaByBitacoraServcio(
			int idOperacion) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			FabricaDeDAOs fabricaMySQL = null;

			ClienteRfcDAO clienteRfcDAO = null;
			BitacoraServicioDAO bitacoraServicioDAO = null;

			ArrayList<Integer> listIdDetallePrefactura = null;
			ArrayList<BitacoraServicioTO> listBitacoraServicioTO = null;
			ArrayList<ClienteRfcTO> listClienteRfcTO = null;
			ArrayList<Boolean> listConsiderado = null;

			DetallePrefacturaTO DetallePrefacturaTO = null;

			PreparedStatement ps = conexion
					.prepareStatement(SELECTBYBITACORASERVICIO);
			
			ps.setInt(1, idOperacion);
			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (listIdDetallePrefactura == null) {

					listIdDetallePrefactura = new ArrayList<Integer>();
					listClienteRfcTO = new ArrayList<ClienteRfcTO>();
					listBitacoraServicioTO = new ArrayList<BitacoraServicioTO>();
					listConsiderado = new ArrayList<Boolean>();
					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					clienteRfcDAO = fabricaMySQL.getClienteRfcDAO();
					bitacoraServicioDAO = fabricaMySQL.getBitacoraServicioDAO();
				}

				listIdDetallePrefactura.add(rs.getInt("id_detalle_prefactura"));
				listClienteRfcTO.add(clienteRfcDAO.findClienteRfcById(rs
						.getInt("id_cliente_rfc")));
				listConsiderado.add(rs.getBoolean("considerado"));
			}
			if (listIdDetallePrefactura != null) {
				listBitacoraServicioTO.add(bitacoraServicioDAO
						.findBitacoraServicioById(idOperacion));

				Integer[] arrIdDetallePrefactura = (Integer[]) listIdDetallePrefactura
						.toArray(new Integer[listIdDetallePrefactura.size()]);
				Boolean[] arrConsiderado = (Boolean[]) listConsiderado
						.toArray(new Boolean[listConsiderado.size()]);
				ClienteRfcTO[] arrClienteRfcTO = (ClienteRfcTO[]) listClienteRfcTO
						.toArray(new ClienteRfcTO[listClienteRfcTO.size()]);
				BitacoraServicioTO[] arrBitacoraServicioTO = (BitacoraServicioTO[]) listBitacoraServicioTO
						.toArray(new BitacoraServicioTO[listBitacoraServicioTO
								.size()]);

				DetallePrefacturaTO = new DetallePrefacturaTO(
						arrIdDetallePrefactura, arrClienteRfcTO,
						arrBitacoraServicioTO, arrConsiderado);
			}
			ps.close();
			conexion.close();
			return DetallePrefacturaTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public DetallePrefacturaTO selectdetalleprefacturaByBitacoraServcioConsiderado(
			int idOperacion, boolean considerado) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			FabricaDeDAOs fabricaMySQL = null;

			ClienteRfcDAO clienteRfcDAO = null;
			BitacoraServicioDAO bitacoraServicioDAO = null;

			ArrayList<Integer> listIdDetallePrefactura = null;
			ArrayList<BitacoraServicioTO> listBitacoraServicioTO = null;
			ArrayList<ClienteRfcTO> listClienteRfcTO = null;
			ArrayList<Boolean> listConsiderado = null;

			DetallePrefacturaTO DetallePrefacturaTO = null;

			PreparedStatement ps = conexion
					.prepareStatement(SELECTBYBITACORASERVICIOCONSIDERADO);
			ps.setInt(1, idOperacion);
			ps.setBoolean(2, considerado);
			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (listIdDetallePrefactura == null) {

					listIdDetallePrefactura = new ArrayList<Integer>();
					listClienteRfcTO = new ArrayList<ClienteRfcTO>();
					listBitacoraServicioTO = new ArrayList<BitacoraServicioTO>();
					listConsiderado = new ArrayList<Boolean>();
					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					clienteRfcDAO = fabricaMySQL.getClienteRfcDAO();
					bitacoraServicioDAO = fabricaMySQL.getBitacoraServicioDAO();
				}

				listIdDetallePrefactura.add(rs.getInt("id_detalle_prefactura"));
				listClienteRfcTO.add(clienteRfcDAO.findClienteRfcById(rs
						.getInt("id_cliente_rfc")));
				listConsiderado.add(rs.getBoolean("considerado"));
			}
			if (listIdDetallePrefactura != null) {
				listBitacoraServicioTO.add(bitacoraServicioDAO
						.findBitacoraServicioById(idOperacion));

				Integer[] arrIdDetallePrefactura = (Integer[]) listIdDetallePrefactura
						.toArray(new Integer[listIdDetallePrefactura.size()]);
				Boolean[] arrConsiderado = (Boolean[]) listConsiderado
						.toArray(new Boolean[listConsiderado.size()]);
				ClienteRfcTO[] arrClienteRfcTO = (ClienteRfcTO[]) listClienteRfcTO
						.toArray(new ClienteRfcTO[listClienteRfcTO.size()]);
				BitacoraServicioTO[] arrBitacoraServicioTO = (BitacoraServicioTO[]) listBitacoraServicioTO
						.toArray(new BitacoraServicioTO[listBitacoraServicioTO
								.size()]);

				DetallePrefacturaTO = new DetallePrefacturaTO(
						arrIdDetallePrefactura, arrClienteRfcTO,
						arrBitacoraServicioTO, arrConsiderado);
			}
			ps.close();
			conexion.close();
			return DetallePrefacturaTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public DetallePrefacturaTO selectDetallePrefacturaByClienteRfc(
			int idClienteRfc) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			FabricaDeDAOs fabricaMySQL = null;

			ClienteRfcDAO clienteRfcDAO = null;
			BitacoraServicioDAO bitacoraServicioDAO = null;

			ArrayList<Integer> listIdDetallePrefactura = null;
			ArrayList<BitacoraServicioTO> listBitacoraServicioTO = null;
			ArrayList<ClienteRfcTO> listClienteRfcTO = null;
			ArrayList<Boolean> listConsiderado = null;

			DetallePrefacturaTO DetallePrefacturaTO = null;

			PreparedStatement ps = conexion
					.prepareStatement(SELECTBYCLIENTERFC);
			ps.setInt(1, idClienteRfc);
			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (listIdDetallePrefactura == null) {

					listIdDetallePrefactura = new ArrayList<Integer>();
					listClienteRfcTO = new ArrayList<ClienteRfcTO>();
					listBitacoraServicioTO = new ArrayList<BitacoraServicioTO>();
					listConsiderado = new ArrayList<Boolean>();
					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					clienteRfcDAO = fabricaMySQL.getClienteRfcDAO();
					bitacoraServicioDAO = fabricaMySQL.getBitacoraServicioDAO();
				}

				listIdDetallePrefactura.add(rs.getInt("id_detalle_prefactura"));
				listBitacoraServicioTO.add(bitacoraServicioDAO
						.findBitacoraServicioById(rs.getInt("id_cliente_rfc")));
				listConsiderado.add(rs.getBoolean("considerado"));
			}
			if (listIdDetallePrefactura != null) {
				listClienteRfcTO.add(clienteRfcDAO
						.findClienteRfcById(idClienteRfc));
				Integer[] arrIdDetallePrefactura = (Integer[]) listIdDetallePrefactura
						.toArray(new Integer[listIdDetallePrefactura.size()]);
				Boolean[] arrConsiderado = (Boolean[]) listConsiderado
						.toArray(new Boolean[listConsiderado.size()]);
				ClienteRfcTO[] arrClienteRfcTO = (ClienteRfcTO[]) listClienteRfcTO
						.toArray(new ClienteRfcTO[listClienteRfcTO.size()]);
				BitacoraServicioTO[] arrBitacoraServicioTO = (BitacoraServicioTO[]) listBitacoraServicioTO
						.toArray(new BitacoraServicioTO[listBitacoraServicioTO
								.size()]);

				DetallePrefacturaTO = new DetallePrefacturaTO(
						arrIdDetallePrefactura, arrClienteRfcTO,
						arrBitacoraServicioTO, arrConsiderado);
			}
			ps.close();
			conexion.close();
			return DetallePrefacturaTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public DetallePrefacturaTO selectDetallePrefacturaByClienteRfcConsiderado(
			int idClienteRfc, boolean considerado) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			FabricaDeDAOs fabricaMySQL = null;

			ClienteRfcDAO clienteRfcDAO = null;
			BitacoraServicioDAO bitacoraServicioDAO = null;

			ArrayList<Integer> listIdDetallePrefactura = null;
			ArrayList<BitacoraServicioTO> listBitacoraServicioTO = null;
			ArrayList<ClienteRfcTO> listClienteRfcTO = null;
			ArrayList<Boolean> listConsiderado = null;

			DetallePrefacturaTO DetallePrefacturaTO = null;

			PreparedStatement ps = conexion
					.prepareStatement(SELECTBYCLIENTERFCCONSIDERADO);
			
			ps.setInt(1, idClienteRfc);
			ps.setBoolean(2, considerado);
			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (listIdDetallePrefactura == null) {

					listIdDetallePrefactura = new ArrayList<Integer>();
					listClienteRfcTO = new ArrayList<ClienteRfcTO>();
					listBitacoraServicioTO = new ArrayList<BitacoraServicioTO>();
					listConsiderado = new ArrayList<Boolean>();
					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					clienteRfcDAO = fabricaMySQL.getClienteRfcDAO();
					bitacoraServicioDAO = fabricaMySQL.getBitacoraServicioDAO();
				}

				listIdDetallePrefactura.add(rs.getInt("id_detalle_prefactura"));
				listBitacoraServicioTO.add(bitacoraServicioDAO
						.findBitacoraServicioById(rs.getInt("id_cliente_rfc")));
				listConsiderado.add(rs.getBoolean("considerado"));
			}
			if (listIdDetallePrefactura != null) {
				listClienteRfcTO.add(clienteRfcDAO
						.findClienteRfcById(idClienteRfc));
				Integer[] arrIdDetallePrefactura = (Integer[]) listIdDetallePrefactura
						.toArray(new Integer[listIdDetallePrefactura.size()]);
				Boolean[] arrConsiderado = (Boolean[]) listConsiderado
						.toArray(new Boolean[listConsiderado.size()]);
				ClienteRfcTO[] arrClienteRfcTO = (ClienteRfcTO[]) listClienteRfcTO
						.toArray(new ClienteRfcTO[listClienteRfcTO.size()]);
				BitacoraServicioTO[] arrBitacoraServicioTO = (BitacoraServicioTO[]) listBitacoraServicioTO
						.toArray(new BitacoraServicioTO[listBitacoraServicioTO
								.size()]);

				DetallePrefacturaTO = new DetallePrefacturaTO(
						arrIdDetallePrefactura, arrClienteRfcTO,
						arrBitacoraServicioTO, arrConsiderado);
			}
			ps.close();
			conexion.close();
			return DetallePrefacturaTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public ArrayList<DetallePrefacturaTO> selectDetallePrefacturaByRegistro(
			String registro) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			FabricaDeDAOs fabricaMySQL = null;

			ClienteRfcDAO clienteRfcDAO = null;
			BitacoraServicioDAO bitacoraServicioDAO = null;

			ArrayList<DetallePrefacturaTO> detallePrefacturaTO = null;
			DetallePrefacturaTO detallePrefacturaTO2 = null;

			PreparedStatement ps = conexion.prepareStatement(SELECTBYREGISTRO);
			ps.setString(1, registro);
			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (detallePrefacturaTO == null) {
					detallePrefacturaTO = new ArrayList<DetallePrefacturaTO>();
					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);
					clienteRfcDAO = fabricaMySQL.getClienteRfcDAO();
					bitacoraServicioDAO = fabricaMySQL.getBitacoraServicioDAO();
				}

				int idDetallePrefactura = rs.getInt("DP.id_detalle_prefactura");
				ArrayList<ClienteRfcTO> listClienteRfcTO = new ArrayList<ClienteRfcTO>();
				ArrayList<BitacoraServicioTO> listBitacoraServicioTO = new ArrayList<BitacoraServicioTO>();

				listClienteRfcTO.add(clienteRfcDAO.findClienteRfcById(rs
						.getInt("DP.id_cliente_rfc")));
				listBitacoraServicioTO
						.add(bitacoraServicioDAO.findBitacoraServicioById(rs
								.getInt("DP.id_operacion")));
				boolean considerado = rs.getBoolean("DP.considerado");

				ClienteRfcTO[] arrClienteRfcTO = (ClienteRfcTO[]) listClienteRfcTO
						.toArray(new ClienteRfcTO[listClienteRfcTO.size()]);
				BitacoraServicioTO[] arrBitacoraServicioTO = (BitacoraServicioTO[]) listBitacoraServicioTO
						.toArray(new BitacoraServicioTO[listBitacoraServicioTO
								.size()]);

				detallePrefacturaTO2 = new DetallePrefacturaTO(
						idDetallePrefactura, arrClienteRfcTO,
						arrBitacoraServicioTO, considerado);

				detallePrefacturaTO.add(detallePrefacturaTO2);
			}
			ps.close();
			conexion.close();
			return detallePrefacturaTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public ArrayList<DetallePrefacturaTO> selectDetallePrefacturaByRegistroCosiderado(
			String registro, boolean considerado) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			FabricaDeDAOs fabricaMySQL = null;

			ClienteRfcDAO clienteRfcDAO = null;
			BitacoraServicioDAO bitacoraServicioDAO = null;

			ArrayList<DetallePrefacturaTO> detallePrefacturaTO = null;
			DetallePrefacturaTO detallePrefacturaTO2 = null;

			PreparedStatement ps = conexion
					.prepareStatement(SELECTBYREGISTROCONSIDERADO);
			ps.setString(1, registro);
			ps.setBoolean(2, considerado);
			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (detallePrefacturaTO == null) {
					detallePrefacturaTO = new ArrayList<DetallePrefacturaTO>();
					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);
					clienteRfcDAO = fabricaMySQL.getClienteRfcDAO();
					bitacoraServicioDAO = fabricaMySQL.getBitacoraServicioDAO();
				}

				int idDetallePrefactura = rs.getInt("DP.id_detalle_prefactura");
				ArrayList<ClienteRfcTO> listClienteRfcTO = new ArrayList<ClienteRfcTO>();
				ArrayList<BitacoraServicioTO> listBitacoraServicioTO = new ArrayList<BitacoraServicioTO>();

				listClienteRfcTO.add(clienteRfcDAO.findClienteRfcById(rs
						.getInt("DP.id_cliente_rfc")));
				listBitacoraServicioTO
						.add(bitacoraServicioDAO.findBitacoraServicioById(rs
								.getInt("DP.id_operacion")));
				considerado = rs.getBoolean("DP.considerado");

				ClienteRfcTO[] arrClienteRfcTO = (ClienteRfcTO[]) listClienteRfcTO
						.toArray(new ClienteRfcTO[listClienteRfcTO.size()]);
				BitacoraServicioTO[] arrBitacoraServicioTO = (BitacoraServicioTO[]) listBitacoraServicioTO
						.toArray(new BitacoraServicioTO[listBitacoraServicioTO
								.size()]);

				detallePrefacturaTO2 = new DetallePrefacturaTO(
						idDetallePrefactura, arrClienteRfcTO,
						arrBitacoraServicioTO, considerado);

				detallePrefacturaTO.add(detallePrefacturaTO2);
			}
			ps.close();
			conexion.close();
			return detallePrefacturaTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public short updateDetallePrefactura(DetallePrefacturaTO detallePrefacturaTO) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(UPDATE);

			ps.setInt(1, detallePrefacturaTO.getIdClienteRfc());
			ps.setInt(2, detallePrefacturaTO.getIdOperacion());
			ps.setBoolean(3, detallePrefacturaTO.getConsiderado());
			ps.setInt(4, detallePrefacturaTO.getIdDetallePrefactura());

			ps.executeUpdate();

			if (ps.getUpdateCount() == 0) {
				ps.close();
				conexion.close();
				return 0;
			} else {
				ps.close();
				conexion.close();
				return 1;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return (short) -1;
		}
	}

}
